-- 这个是运行在node节点上的一个router，处理所有来访问这个节点的请求
-- 可以根据各个函数的参数去调用不同的服务
-- 这里特意命名为router，主要是为了和老框架的proxy区分开，这个router，会有返回的。
local filename = "router.lua"

local skynet = require "skynet"
local cluster = require "skynet.cluster"
require "skynet.manager"

local filelog = require "filelog"
local routerbase = require "routerbase"

local datadao = {r={}, w={}} -- 读写核心数据库的
local slice = 16 -- 分16片

local Router = routerbase:new()

-- 下面四个函数不是通用的mysql操作函数，而是根据rid，keyid来操作的
-- 参数：rid, table, keyid, fields
-- 如果是单行表 ，keyid，就设置成rid
-- 根据读写，rid分片，路由到不同的opdata service操作

-- 从存储中（redis，mysql）获取数据
-- 如果redis有，直接获取，如果没有，从mysql获取，并同步写入redis
-- 参数： rid ， table
-- 返回：条数，数据记录table， key是 rid（单行表）， keyid（多行表）
function Router.CMD.select_rk(rid, ...)
	return skynet.call(datadao.r[ridslice(rid)], "lua", "select_rk", rid, ...)
end

-- 插入数据，只有多行表才有显式插入，单行在select的时候已经默认值插入了
-- 如果redis有这个记录集，则写入redis，如果没有，只插人mysql
-- 参数：rid, table, keyid, fields
-- fields 是个table 为 字段名：值的格式
function Router.CMD.insert_rk(rid, ...)
	return skynet.call(datadao.w[ridslice(rid)], "lua", "insert_rk", rid, ...)
end

-- 删除记录，只有多行表才有删除
-- 如果redis有这个记录集，则redis删除，如果没有，只删除mysql
-- 参数 rid, table, keyid
function Router.CMD.delete_rk(rid, ...)
	return skynet.call(datadao.w[ridslice(rid)], "lua", "delete_rk", rid, ...)
end

-- 修改记录，单，多行都
-- 如果redis有这个记录集，则redis数据也要修改，如果没有，只修改mysql
-- 参数 rid, table, keyid, fields （如果单行表，则keyid 会被忽视，可以直接填入rid 或者 _,）
-- fields 是个table 为 字段名：值的格式
function Router.CMD.update_rk(rid, ...)
	return skynet.call(datadao.w[ridslice(rid)], "lua", "update_rk", rid, ...)
end

-- mysql的通用查询接口
-- 应该只做select
-- 如果没有rid，或者通用的，这里填写1
function Router.CMD.mysqlquery(rid, sqlstr)
	return skynet.call(datadao.r[ridslice(rid)], "lua", "mysqlquery", sqlstr)
end

-- 按rid分片，可以定位到不同的opdata	
function ridslice(rid)
	return (rid%slice)+1
end

-- 只有loginnode调用, authwx, authuser, authguest
function Router.CMD.authwx(unionid, rolename, agencyrid, ...)
	return skynet.call(".authdao", "lua", "authwx", unionid, rolename, agencyrid, ...)
end

-- 只有loginnode调用, authwx, authuser, authguest
function Router.CMD.authother(username, cpass, ...)
	return skynet.call(".authdao", "lua", "authother",username, cpass, ...)
end

function Router.CMD.authuser(username, cpass, ...)
	return skynet.call(".authdao", "lua", "authuser", username, cpass, ...)
end

function Router.CMD.authphone(phonenum, phonecpass, ...)
	return skynet.call(".authdao", "lua", "authphone", phonenum, phonecpass, ...)
end

function Router.CMD.authguest(randmobileid, ...)
	return skynet.call(".authdao", "lua", "authguest", randmobileid, ...)
end

function Router.CMD.check_is_newuser(...)
	return skynet.call(".authdao", "lua", "check_is_newuser", ...)
end

-- 生成新的排行榜数据
function Router.CMD.newrank(...)
	return skynet.call(".authdao", "lua", "newrank", ...)
end


skynet.start(function()
	Router:start()
	skynet.name(".authdao", skynet.uniqueservice("opauth") )
	skynet.call(".authdao", "lua", "init")
	if not skynet.call(".authdao", "lua", "checkdb") then
		skynet.abort()
	end
	for i=1, slice do
		datadao.r[i] = skynet.newservice("opdata")
		skynet.call(datadao.r[i], "lua", "init")
		datadao.w[i] = skynet.newservice("opdata")
		skynet.call(datadao.w[i], "lua", "init")
	end
end)

